package com.zeng.sboot.amqp.producer.config.amqp;

import com.alibaba.fastjson.JSON;
import com.zeng.sboot.demo.amqp.domain.Order;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.support.CorrelationData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

//符号“#”和符号“*”。#匹配0个或多个单词，*匹配不多不少一个单词
@Component
public class OrderSender {

    @Autowired
    private RabbitTemplate rabbitTemplate;


    // 回调函数: confirm 确认
    final RabbitTemplate.ConfirmCallback confirmCallback = new RabbitTemplate.ConfirmCallback() {
        @Override
        public void confirm(CorrelationData correlationData, boolean ack, String cause) {
            System.out.println("correlationData: " + correlationData);
            String messageId = correlationData.getId();
            if (ack) {
                // 如果 confirm 返回成功, 则进行下一步操作
                //messageLogMapper.changeMessageLogStatus(messageId, Constants.ORDER_SEND_SUCC ,new Date());
            } else {
                // 失败则进行具体的后续操作, 重试 或者 补偿 手段
                System.err.println("RabbitOrderSender 进入了异常处理...");
            }
        }
    };

    public String OrderSender1(Order order) {
        // 设置 消息被接收了 后的回调
        rabbitTemplate.setConfirmCallback(confirmCallback);
        // 消息唯一ID
        CorrelationData correlationData = new CorrelationData(order.getOrderId().toString());

        String message = JSON.toJSONString(order);
        System.out.println(message);
        /**
         * 发送消息时直接添加 order 这个对象，是因为配置了 MessageConverter messageConverter(){return new Jackson2JsonMessageConverter();} 这个消息转换器
         *
         * 也可以使用 FastJson 转换成 jsonstring 后返回
         */
        rabbitTemplate.convertAndSend("com-exchange", "com-route-key.*", order, correlationData);

        return "success";
    }



}
